🎖️GitЯра🎖️
Commit 8daafe6f704a0e81165f5de28ffa5e3889e63dbd
Parents : f77998d
Author : James Rich <2199651+jamesarich@users.noreply.github.com>
Signature : Signature validation error
Date : 2026-06-10T11:40:42-05:00
Committer : GitHub <noreply@github.com>
Date : 2026-06-10T16:40:42Z
Replace :core:proto with org.meshtastic:protobufs:2.7.25 (#5675)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Changes
32 files changed, 149 insertions(+), 1172 deletions(-)
Diff
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index c7adfe346f..0000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,4 +0,0 @@
-[submodule "app proto submodule"]
- path = core/proto/src/main/proto
- url = https://github.com/meshtastic/protobufs.git
- branch = master
diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts
index bc3697bf8e..397641364f 100644
--- a/androidApp/build.gradle.kts
+++ b/androidApp/build.gradle.kts
@@ -210,7 +210,7 @@ dependencies {
implementation(projects.core.network)
implementation(projects.core.nfc)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.service)
implementation(projects.core.resources)
implementation(projects.core.ui)
diff --git a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt
index 45cc867bab..73f91da84e 100644
--- a/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt
+++ b/build-logic/convention/src/main/kotlin/RootConventionPlugin.kt
@@ -95,7 +95,6 @@ private val ALL_MODULES_FULL =
":core:network",
":core:nfc",
":core:prefs",
- ":core:proto",
":core:repository",
":core:service",
":core:resources",
@@ -118,11 +117,10 @@ private val ALL_MODULES_FULL =
private val ANDROID_ONLY_MODULES = setOf(":androidApp", ":core:api", ":core:barcode", ":feature:widget")
/**
- * Modules excluded from Dokka aggregation. :core:proto contains only auto-generated Wire classes (no KDoc value) and
- * its TAKPacket-SDK dependency doesn't publish iOS metadata JARs, causing `transformCommonMainDependenciesMetadata` to
- * fail during Dokka resolution.
+ * Modules excluded from Dokka aggregation. Empty now that :core:proto has been replaced by
+ * the external org.meshtastic:protobufs SDK.
*/
-private val DOKKA_EXCLUDED_MODULES = setOf(":core:proto")
+private val DOKKA_EXCLUDED_MODULES = emptySet<String>()
private fun allModules(): List<String> = ALL_MODULES_FULL
diff --git a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt
index 32bc87ffff..3a5f819091 100644
--- a/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt
+++ b/build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt
@@ -147,20 +147,6 @@ internal fun Project.configureKotlinMultiplatform() {
}
}
- // TAKPacket-SDK doesn't publish iOS metadata JARs (the .klib exists but the metadata
- // .jar returns 404). iOS native compilation resolves fine via .klib, but
- // `transformCommonMainDependenciesMetadata` (triggered by Dokka/publishing) fails.
- // Exclude the SDK only from the CompilationDependenciesMetadata configs that feed
- // the metadata transform — NOT from Implementation/Resolvable configs which feed the
- // actual compiler classpath.
- val iosMetadataConfigs =
- setOf("iosArm64CompilationDependenciesMetadata", "iosSimulatorArm64CompilationDependenciesMetadata")
- configurations.configureEach {
- if (name in iosMetadataConfigs) {
- exclude(mapOf("group" to "org.meshtastic", "module" to "takpacket-sdk"))
- }
- }
-
configureMokkery()
configureKotlin<KotlinMultiplatformExtension>()
}
diff --git a/build.gradle.kts b/build.gradle.kts
index 0cff19056c..e6b32a9736 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -46,11 +46,13 @@ plugins.withId("org.meshtastic.flatpak.sources") {
extensions.configure<org.meshtastic.flatpak.sources.FlatpakSourcesExtension> {
outputFile.set(layout.buildDirectory.file("flatpak-sources.json"))
mustRunAfterTasks.set(listOf(":desktopApp:assemble", ":desktopApp:packageUberJarForCurrentOS"))
- // Force-resolve platform-specific native artifacts not resolved on the generation host
+ // Force-resolve platform-specific native artifacts not resolved on the generation host.
+ // The compose-desktop version MUST track the compose-multiplatform catalog version, else the
+ // arm64 offline flatpak build fails to resolve desktop-jvm-linux-arm64 (skiko version per its POM).
targetPlatforms.set(setOf("linux-x64", "linux-arm64"))
platformDependencies.set(setOf(
"org.jetbrains.skiko:skiko-awt-runtime-{platform}:0.144.6",
- "org.jetbrains.compose.desktop:desktop-jvm-{platform}:1.11.0",
+ "org.jetbrains.compose.desktop:desktop-jvm-{platform}:1.11.1",
))
}
}
diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts
index 38a436fbd8..6d8352daa2 100644
--- a/core/data/build.gradle.kts
+++ b/core/data/build.gradle.kts
@@ -35,7 +35,7 @@ kotlin {
implementation(projects.core.model)
implementation(projects.core.network)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.takserver)
implementation(libs.jetbrains.lifecycle.runtime)
diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts
index 20725071a6..1f56b06c7e 100644
--- a/core/database/build.gradle.kts
+++ b/core/database/build.gradle.kts
@@ -38,7 +38,7 @@ kotlin {
api(projects.core.common)
implementation(projects.core.di)
api(projects.core.model)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.resources)
implementation(libs.androidx.room.paging)
implementation(libs.kotlinx.serialization.json)
diff --git a/core/datastore/build.gradle.kts b/core/datastore/build.gradle.kts
index 589db07f56..7657f4ba66 100644
--- a/core/datastore/build.gradle.kts
+++ b/core/datastore/build.gradle.kts
@@ -28,7 +28,7 @@ kotlin {
commonMain.dependencies {
implementation(projects.core.common)
implementation(projects.core.model)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
api(libs.androidx.datastore)
api(libs.androidx.datastore.preferences)
implementation(libs.kotlinx.serialization.json)
diff --git a/core/domain/build.gradle.kts b/core/domain/build.gradle.kts
index c75f24cfbd..8a1f5d8983 100644
--- a/core/domain/build.gradle.kts
+++ b/core/domain/build.gradle.kts
@@ -27,7 +27,7 @@ kotlin {
commonMain.dependencies {
implementation(projects.core.repository)
implementation(projects.core.model)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.common)
implementation(projects.core.database)
implementation(projects.core.datastore)
diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts
index f47e063395..83e3a90f2b 100644
--- a/core/model/build.gradle.kts
+++ b/core/model/build.gradle.kts
@@ -31,7 +31,7 @@ kotlin {
sourceSets {
commonMain.dependencies {
- api(projects.core.proto)
+ api(libs.meshtastic.protobufs)
api(projects.core.common)
api(projects.core.resources)
@@ -42,6 +42,17 @@ kotlin {
api(libs.okio)
api(libs.compose.multiplatform.resources)
}
+ jvmAndroidMain.dependencies {
+ // TAKPacket-SDK publishes only JVM artifacts since 0.5.2 (proto types
+ // now come from the protobufs SDK above; the CoT conversion pipeline is
+ // zstd-jni/xpp3-bound). Scoped to jvmAndroidMain so iOS compilations
+ // never try to resolve it — iOS code goes through the expect/actual
+ // seams in :core:takserver instead.
+ api(libs.takpacket.sdk.kmp.get().toString()) {
+ exclude(group = "com.github.luben", module = "zstd-jni")
+ exclude(group = "org.ogce", module = "xpp3")
+ }
+ }
androidMain.dependencies {
api(libs.androidx.annotation)
api(libs.androidx.core.ktx)
diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts
index 905927fdc7..b9fbc1589e 100644
--- a/core/network/build.gradle.kts
+++ b/core/network/build.gradle.kts
@@ -31,7 +31,7 @@ kotlin {
implementation(projects.core.common)
implementation(projects.core.di)
implementation(projects.core.model)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.ble)
implementation(libs.okio)
diff --git a/core/proto/README.md b/core/proto/README.md
deleted file mode 100644
index 35d276b205..0000000000
--- a/core/proto/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# `:core:proto`
-
-## Overview
-
-**Targets:** Android · JVM (Desktop) · iOS
-
-This module contains the generated Kotlin and Java code from the Meshtastic Protobuf definitions. It uses the [Wire](https://github.com/square/wire) library for efficient and clean model generation.
-
-## Key Components
-
-- **`PortNum`**: Defines the identification for different types of data payloads.
-- **`MeshPacket`**: The core protocol message definition.
-- **Protobuf Modules**: Definitions for telemetry, position, administration, and more.
-
-## Usage
-This module is a low-level dependency for any module that needs to encode or decode Meshtastic protocol data.
-
-```kotlin
-implementation(projects.core.proto)
-```
-
-
-## Dependency Graph
-
-<!--region graph-->
-```mermaid
-graph TB
- :core:proto[proto]:::kmp-library
-
-classDef android-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
-classDef android-application-compose fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
-classDef compose-desktop-application fill:#CAFFBF,stroke:#000,stroke-width:2px,color:#000;
-classDef android-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
-classDef android-library fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
-classDef android-library-compose fill:#9BF6FF,stroke:#000,stroke-width:2px,color:#000;
-classDef android-test fill:#A0C4FF,stroke:#000,stroke-width:2px,color:#000;
-classDef jvm-library fill:#BDB2FF,stroke:#000,stroke-width:2px,color:#000;
-classDef kmp-feature fill:#FFD6A5,stroke:#000,stroke-width:2px,color:#000;
-classDef kmp-library-compose fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
-classDef kmp-library fill:#FFC1CC,stroke:#000,stroke-width:2px,color:#000;
-classDef unknown fill:#FFADAD,stroke:#000,stroke-width:2px,color:#000;
-
-```
-<!--endregion-->
diff --git a/core/proto/build.gradle.kts b/core/proto/build.gradle.kts
deleted file mode 100644
index 9ac2ce792b..0000000000
--- a/core/proto/build.gradle.kts
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2026 Meshtastic LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-plugins {
- alias(libs.plugins.meshtastic.kmp.library)
- alias(libs.plugins.wire)
- id("meshtastic.publishing")
-}
-
-kotlin {
- // Override minSdk for ATAK compatibility (standard is 26)
- android { minSdk = 21 }
-
- sourceSets {
- commonMain.dependencies {
- api(libs.wire.runtime)
-
- // TAKPacket-SDK owns atak.proto Wire codegen (see
- // https://github.com/meshtastic/TAKPacket-SDK/issues/6).
- // The prune directives below stop this module from emitting
- // those classes; the SDK ships them and we re-export via api()
- // so every consumer of :core:proto gets TAKPacketV2, GeoChat,
- // etc. transitively. No dual codegen, no R8 duplicates, no
- // cross-repo ABI drift.
- //
- // Team and MemberRole are NOT pruned — they are used as fields
- // in ModuleConfig.TAKConfig and the SDK deliberately strips
- // them from its JVM JAR so our codegen is the single source.
- //
- // Excludes:
- // zstd-jni — Android needs the @aar variant; :core:takserver
- // re-adds it per-target.
- // xpp3 — Android provides XmlPullParser as a platform
- // class; :core:takserver re-adds for desktop.
- api(libs.takpacket.sdk.kmp.get().toString()) {
- exclude(group = "com.github.luben", module = "zstd-jni")
- exclude(group = "org.ogce", module = "xpp3")
- }
- }
- }
-}
-
-wire {
- sourcePath {
- srcDir("src/main/proto")
- srcDir("src/main/wire-includes")
- // Upstream added packages/kmp/ with symlinks back to root protos.
- // Without filtering, Wire follows the symlinks and loads duplicates.
- include("meshtastic/**/*.proto")
- include("nanopb.proto")
- include("google/**/*.proto")
- }
- kotlin {
- // Wire 6 optimization: Avoid unnecessary immutable copies of repeated/map fields.
- // Improves performance by reducing allocations when decoding/creating messages.
- makeImmutableCopies = false
-
- // Flattens 'oneof' fields into nullable properties on the parent class.
- // This removes the intermediate sealed classes, simplifying usage and reducing method count/binary size.
- // Codebase is already written to use the nullable properties (e.g. packet.decoded vs
- // packet.payload_variant.decoded).
- boxOneOfsMinSize = 5000
- }
- root("meshtastic.*")
- prune("meshtastic.MeshPacket#delayed")
- prune("meshtastic.MeshPacket.Delayed")
-
- // ── atak.proto types ────────────────────────────────────────────────────
- // Owned by TAKPacket-SDK (v0.2.3+), which ships the Wire-generated
- // classes in its KMP artifacts. The api() dep above re-exports them.
- // Wire prune() does not cascade to nested types — each must be explicit.
- //
- // Team and MemberRole are NOT pruned — they are used as fields in
- // ModuleConfig.TAKConfig and the SDK strips them from its JVM JAR so
- // our codegen remains the single source for those two enums.
- prune("meshtastic.TAKPacket")
- prune("meshtastic.TAKPacketV2")
- prune("meshtastic.GeoChat")
- prune("meshtastic.GeoChat.ReceiptType")
- prune("meshtastic.Group")
- prune("meshtastic.Status")
- prune("meshtastic.Contact")
- prune("meshtastic.PLI")
- prune("meshtastic.AircraftTrack")
- prune("meshtastic.CotGeoPoint")
- prune("meshtastic.DrawnShape")
- prune("meshtastic.DrawnShape.Kind")
- prune("meshtastic.DrawnShape.StyleMode")
- prune("meshtastic.Marker")
- prune("meshtastic.Marker.Kind")
- prune("meshtastic.RangeAndBearing")
- prune("meshtastic.Route")
- prune("meshtastic.Route.Method")
- prune("meshtastic.Route.Direction")
- prune("meshtastic.Route.Link")
- prune("meshtastic.CasevacReport")
- prune("meshtastic.CasevacReport.Precedence")
- prune("meshtastic.CasevacReport.HlzMarking")
- prune("meshtastic.CasevacReport.Security")
- prune("meshtastic.ZMistEntry")
- prune("meshtastic.EmergencyAlert")
- prune("meshtastic.EmergencyAlert.Type")
- prune("meshtastic.TaskRequest")
- prune("meshtastic.TaskRequest.Priority")
- prune("meshtastic.TaskRequest.Status")
- prune("meshtastic.TAKEnvironment")
- prune("meshtastic.SensorFov")
- prune("meshtastic.SensorFov.SensorType")
- prune("meshtastic.CotHow")
- prune("meshtastic.CotType")
- prune("meshtastic.GeoPointSource")
- prune("meshtastic.TakTalkMessage")
- prune("meshtastic.TakTalkRoomData")
- // Marti is also shipped by the TAKPacket-SDK jar (org.meshtastic.proto.Marti),
- // so it must be pruned here too or R8 fails with a duplicate-class error at
- // release minify. (Team/MemberRole are NOT shipped by the SDK, so they stay.)
- prune("meshtastic.Marti")
-}
-
-// Modern KMP publication uses the project name as the artifactId by default.
-// We rename the publications to include the 'core-' prefix for consistency.
-publishing {
- publications.withType<MavenPublication>().configureEach {
- val baseId = artifactId
- if (baseId == "proto") {
- artifactId = "meshtastic-android-proto"
- } else if (baseId.startsWith("proto-")) {
- artifactId = baseId.replace("proto-", "meshtastic-android-proto-")
- }
- }
-}
diff --git a/core/proto/src/main/proto b/core/proto/src/main/proto
deleted file mode 160000
index 6b1ded4396..0000000000
--- a/core/proto/src/main/proto
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 6b1ded439633cd03d4af85b44231b91d1d106278
diff --git a/core/proto/src/main/wire-includes/google/protobuf/descriptor.proto b/core/proto/src/main/wire-includes/google/protobuf/descriptor.proto
deleted file mode 100644
index f8eb216cdc..0000000000
--- a/core/proto/src/main/wire-includes/google/protobuf/descriptor.proto
+++ /dev/null
@@ -1,921 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Author: kenton@google.com (Kenton Varda)
-// Based on original Protocol Buffers design by
-// Sanjay Ghemawat, Jeff Dean, and others.
-//
-// The messages in this file describe the definitions found in .proto files.
-// A valid .proto file can be translated directly to a FileDescriptorProto
-// without any other information (e.g. without reading its imports).
-
-
-syntax = "proto2";
-
-package google.protobuf;
-
-option go_package = "google.golang.org/protobuf/types/descriptorpb";
-option java_package = "com.google.protobuf";
-option java_outer_classname = "DescriptorProtos";
-option csharp_namespace = "Google.Protobuf.Reflection";
-option objc_class_prefix = "GPB";
-option cc_enable_arenas = true;
-
-// descriptor.proto must be optimized for speed because reflection-based
-// algorithms don't work during bootstrapping.
-option optimize_for = SPEED;
-
-// The protocol compiler can output a FileDescriptorSet containing the .proto
-// files it parses.
-message FileDescriptorSet {
- repeated FileDescriptorProto file = 1;
-}
-
-// Describes a complete .proto file.
-message FileDescriptorProto {
- optional string name = 1; // file name, relative to root of source tree
- optional string package = 2; // e.g. "foo", "foo.bar", etc.
-
- // Names of files imported by this file.
- repeated string dependency = 3;
- // Indexes of the public imported files in the dependency list above.
- repeated int32 public_dependency = 10;
- // Indexes of the weak imported files in the dependency list.
- // For Google-internal migration only. Do not use.
- repeated int32 weak_dependency = 11;
-
- // All top-level definitions in this file.
- repeated DescriptorProto message_type = 4;
- repeated EnumDescriptorProto enum_type = 5;
- repeated ServiceDescriptorProto service = 6;
- repeated FieldDescriptorProto extension = 7;
-
- optional FileOptions options = 8;
-
- // This field contains optional information about the original source code.
- // You may safely remove this entire field without harming runtime
- // functionality of the descriptors -- the information is needed only by
- // development tools.
- optional SourceCodeInfo source_code_info = 9;
-
- // The syntax of the proto file.
- // The supported values are "proto2" and "proto3".
- optional string syntax = 12;
-}
-
-// Describes a message type.
-message DescriptorProto {
- optional string name = 1;
-
- repeated FieldDescriptorProto field = 2;
- repeated FieldDescriptorProto extension = 6;
-
- repeated DescriptorProto nested_type = 3;
- repeated EnumDescriptorProto enum_type = 4;
-
- message ExtensionRange {
- optional int32 start = 1; // Inclusive.
- optional int32 end = 2; // Exclusive.
-
- optional ExtensionRangeOptions options = 3;
- }
- repeated ExtensionRange extension_range = 5;
-
- repeated OneofDescriptorProto oneof_decl = 8;
-
- optional MessageOptions options = 7;
-
- // Range of reserved tag numbers. Reserved tag numbers may not be used by
- // fields or extension ranges in the same message. Reserved ranges may
- // not overlap.
- message ReservedRange {
- optional int32 start = 1; // Inclusive.
- optional int32 end = 2; // Exclusive.
- }
- repeated ReservedRange reserved_range = 9;
- // Reserved field names, which may not be used by fields in the same message.
- // A given name may only be reserved once.
- repeated string reserved_name = 10;
-}
-
-message ExtensionRangeOptions {
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-// Describes a field within a message.
-message FieldDescriptorProto {
- enum Type {
- // 0 is reserved for errors.
- // Order is weird for historical reasons.
- TYPE_DOUBLE = 1;
- TYPE_FLOAT = 2;
- // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
- // negative values are likely.
- TYPE_INT64 = 3;
- TYPE_UINT64 = 4;
- // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
- // negative values are likely.
- TYPE_INT32 = 5;
- TYPE_FIXED64 = 6;
- TYPE_FIXED32 = 7;
- TYPE_BOOL = 8;
- TYPE_STRING = 9;
- // Tag-delimited aggregate.
- // Group type is deprecated and not supported in proto3. However, Proto3
- // implementations should still be able to parse the group wire format and
- // treat group fields as unknown fields.
- TYPE_GROUP = 10;
- TYPE_MESSAGE = 11; // Length-delimited aggregate.
-
- // New in version 2.
- TYPE_BYTES = 12;
- TYPE_UINT32 = 13;
- TYPE_ENUM = 14;
- TYPE_SFIXED32 = 15;
- TYPE_SFIXED64 = 16;
- TYPE_SINT32 = 17; // Uses ZigZag encoding.
- TYPE_SINT64 = 18; // Uses ZigZag encoding.
- }
-
- enum Label {
- // 0 is reserved for errors
- LABEL_OPTIONAL = 1;
- LABEL_REQUIRED = 2;
- LABEL_REPEATED = 3;
- }
-
- optional string name = 1;
- optional int32 number = 3;
- optional Label label = 4;
-
- // If type_name is set, this need not be set. If both this and type_name
- // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
- optional Type type = 5;
-
- // For message and enum types, this is the name of the type. If the name
- // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
- // rules are used to find the type (i.e. first the nested types within this
- // message are searched, then within the parent, on up to the root
- // namespace).
- optional string type_name = 6;
-
- // For extensions, this is the name of the type being extended. It is
- // resolved in the same manner as type_name.
- optional string extendee = 2;
-
- // For numeric types, contains the original text representation of the value.
- // For booleans, "true" or "false".
- // For strings, contains the default text contents (not escaped in any way).
- // For bytes, contains the C escaped value. All bytes >= 128 are escaped.
- optional string default_value = 7;
-
- // If set, gives the index of a oneof in the containing type's oneof_decl
- // list. This field is a member of that oneof.
- optional int32 oneof_index = 9;
-
- // JSON name of this field. The value is set by protocol compiler. If the
- // user has set a "json_name" option on this field, that option's value
- // will be used. Otherwise, it's deduced from the field's name by converting
- // it to camelCase.
- optional string json_name = 10;
-
- optional FieldOptions options = 8;
-
- // If true, this is a proto3 "optional". When a proto3 field is optional, it
- // tracks presence regardless of field type.
- //
- // When proto3_optional is true, this field must be belong to a oneof to
- // signal to old proto3 clients that presence is tracked for this field. This
- // oneof is known as a "synthetic" oneof, and this field must be its sole
- // member (each proto3 optional field gets its own synthetic oneof). Synthetic
- // oneofs exist in the descriptor only, and do not generate any API. Synthetic
- // oneofs must be ordered after all "real" oneofs.
- //
- // For message fields, proto3_optional doesn't create any semantic change,
- // since non-repeated message fields always track presence. However it still
- // indicates the semantic detail of whether the user wrote "optional" or not.
- // This can be useful for round-tripping the .proto file. For consistency we
- // give message fields a synthetic oneof also, even though it is not required
- // to track presence. This is especially important because the parser can't
- // tell if a field is a message or an enum, so it must always create a
- // synthetic oneof.
- //
- // Proto2 optional fields do not set this flag, because they already indicate
- // optional with `LABEL_OPTIONAL`.
- optional bool proto3_optional = 17;
-}
-
-// Describes a oneof.
-message OneofDescriptorProto {
- optional string name = 1;
- optional OneofOptions options = 2;
-}
-
-// Describes an enum type.
-message EnumDescriptorProto {
- optional string name = 1;
-
- repeated EnumValueDescriptorProto value = 2;
-
- optional EnumOptions options = 3;
-
- // Range of reserved numeric values. Reserved values may not be used by
- // entries in the same enum. Reserved ranges may not overlap.
- //
- // Note that this is distinct from DescriptorProto.ReservedRange in that it
- // is inclusive such that it can appropriately represent the entire int32
- // domain.
- message EnumReservedRange {
- optional int32 start = 1; // Inclusive.
- optional int32 end = 2; // Inclusive.
- }
-
- // Range of reserved numeric values. Reserved numeric values may not be used
- // by enum values in the same enum declaration. Reserved ranges may not
- // overlap.
- repeated EnumReservedRange reserved_range = 4;
-
- // Reserved enum value names, which may not be reused. A given name may only
- // be reserved once.
- repeated string reserved_name = 5;
-}
-
-// Describes a value within an enum.
-message EnumValueDescriptorProto {
- optional string name = 1;
- optional int32 number = 2;
-
- optional EnumValueOptions options = 3;
-}
-
-// Describes a service.
-message ServiceDescriptorProto {
- optional string name = 1;
- repeated MethodDescriptorProto method = 2;
-
- optional ServiceOptions options = 3;
-}
-
-// Describes a method of a service.
-message MethodDescriptorProto {
- optional string name = 1;
-
- // Input and output type names. These are resolved in the same way as
- // FieldDescriptorProto.type_name, but must refer to a message type.
- optional string input_type = 2;
- optional string output_type = 3;
-
- optional MethodOptions options = 4;
-
- // Identifies if client streams multiple client messages
- optional bool client_streaming = 5 [default = false];
- // Identifies if server streams multiple server messages
- optional bool server_streaming = 6 [default = false];
-}
-
-
-// ===================================================================
-// Options
-
-// Each of the definitions above may have "options" attached. These are
-// just annotations which may cause code to be generated slightly differently
-// or may contain hints for code that manipulates protocol messages.
-//
-// Clients may define custom options as extensions of the *Options messages.
-// These extensions may not yet be known at parsing time, so the parser cannot
-// store the values in them. Instead it stores them in a field in the *Options
-// message called uninterpreted_option. This field must have the same name
-// across all *Options messages. We then use this field to populate the
-// extensions when we build a descriptor, at which point all protos have been
-// parsed and so all extensions are known.
-//
-// Extension numbers for custom options may be chosen as follows:
-// * For options which will only be used within a single application or
-// organization, or for experimental options, use field numbers 50000
-// through 99999. It is up to you to ensure that you do not use the
-// same number for multiple options.
-// * For options which will be published and used publicly by multiple
-// independent entities, e-mail protobuf-global-extension-registry@google.com
-// to reserve extension numbers. Simply provide your project name (e.g.
-// Objective-C plugin) and your project website (if available) -- there's no
-// need to explain how you intend to use them. Usually you only need one
-// extension number. You can declare multiple options with only one extension
-// number by putting them in a sub-message. See the Custom Options section of
-// the docs for examples:
-// https://developers.google.com/protocol-buffers/docs/proto#options
-// If this turns out to be popular, a web service will be set up
-// to automatically assign option numbers.
-
-message FileOptions {
-
- // Sets the Java package where classes generated from this .proto will be
- // placed. By default, the proto package is used, but this is often
- // inappropriate because proto packages do not normally start with backwards
- // domain names.
- optional string java_package = 1;
-
-
- // Controls the name of the wrapper Java class generated for the .proto file.
- // That class will always contain the .proto file's getDescriptor() method as
- // well as any top-level extensions defined in the .proto file.
- // If java_multiple_files is disabled, then all the other classes from the
- // .proto file will be nested inside the single wrapper outer class.
- optional string java_outer_classname = 8;
-
- // If enabled, then the Java code generator will generate a separate .java
- // file for each top-level message, enum, and service defined in the .proto
- // file. Thus, these types will *not* be nested inside the wrapper class
- // named by java_outer_classname. However, the wrapper class will still be
- // generated to contain the file's getDescriptor() method as well as any
- // top-level extensions defined in the file.
- optional bool java_multiple_files = 10 [default = false];
-
- // This option does nothing.
- optional bool java_generate_equals_and_hash = 20 [deprecated=true];
-
- // If set true, then the Java2 code generator will generate code that
- // throws an exception whenever an attempt is made to assign a non-UTF-8
- // byte sequence to a string field.
- // Message reflection will do the same.
- // However, an extension field still accepts non-UTF-8 byte sequences.
- // This option has no effect on when used with the lite runtime.
- optional bool java_string_check_utf8 = 27 [default = false];
-
-
- // Generated classes can be optimized for speed or code size.
- enum OptimizeMode {
- SPEED = 1; // Generate complete code for parsing, serialization,
- // etc.
- CODE_SIZE = 2; // Use ReflectionOps to implement these methods.
- LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
- }
- optional OptimizeMode optimize_for = 9 [default = SPEED];
-
- // Sets the Go package where structs generated from this .proto will be
- // placed. If omitted, the Go package will be derived from the following:
- // - The basename of the package import path, if provided.
- // - Otherwise, the package statement in the .proto file, if present.
- // - Otherwise, the basename of the .proto file, without extension.
- optional string go_package = 11;
-
-
-
-
- // Should generic services be generated in each language? "Generic" services
- // are not specific to any particular RPC system. They are generated by the
- // main code generators in each language (without additional plugins).
- // Generic services were the only kind of service generation supported by
- // early versions of google.protobuf.
- //
- // Generic services are now considered deprecated in favor of using plugins
- // that generate code specific to your particular RPC system. Therefore,
- // these default to false. Old code which depends on generic services should
- // explicitly set them to true.
- optional bool cc_generic_services = 16 [default = false];
- optional bool java_generic_services = 17 [default = false];
- optional bool py_generic_services = 18 [default = false];
- optional bool php_generic_services = 42 [default = false];
-
- // Is this file deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for everything in the file, or it will be completely ignored; in the very
- // least, this is a formalization for deprecating files.
- optional bool deprecated = 23 [default = false];
-
- // Enables the use of arenas for the proto messages in this file. This applies
- // only to generated classes for C++.
- optional bool cc_enable_arenas = 31 [default = true];
-
-
- // Sets the objective c class prefix which is prepended to all objective c
- // generated classes from this .proto. There is no default.
- optional string objc_class_prefix = 36;
-
- // Namespace for generated classes; defaults to the package.
- optional string csharp_namespace = 37;
-
- // By default Swift generators will take the proto package and CamelCase it
- // replacing '.' with underscore and use that to prefix the types/symbols
- // defined. When this options is provided, they will use this value instead
- // to prefix the types/symbols defined.
- optional string swift_prefix = 39;
-
- // Sets the php class prefix which is prepended to all php generated classes
- // from this .proto. Default is empty.
- optional string php_class_prefix = 40;
-
- // Use this option to change the namespace of php generated classes. Default
- // is empty. When this option is empty, the package name will be used for
- // determining the namespace.
- optional string php_namespace = 41;
-
- // Use this option to change the namespace of php generated metadata classes.
- // Default is empty. When this option is empty, the proto file name will be
- // used for determining the namespace.
- optional string php_metadata_namespace = 44;
-
- // Use this option to change the package of ruby generated classes. Default
- // is empty. When this option is not set, the package name will be used for
- // determining the ruby package.
- optional string ruby_package = 45;
-
-
- // The parser stores options it doesn't recognize here.
- // See the documentation for the "Options" section above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message.
- // See the documentation for the "Options" section above.
- extensions 1000 to max;
-
- reserved 38;
-}
-
-message MessageOptions {
- // Set true to use the old proto1 MessageSet wire format for extensions.
- // This is provided for backwards-compatibility with the MessageSet wire
- // format. You should not use this for any other reason: It's less
- // efficient, has fewer features, and is more complicated.
- //
- // The message must be defined exactly as follows:
- // message Foo {
- // option message_set_wire_format = true;
- // extensions 4 to max;
- // }
- // Note that the message cannot have any defined fields; MessageSets only
- // have extensions.
- //
- // All extensions of your type must be singular messages; e.g. they cannot
- // be int32s, enums, or repeated messages.
- //
- // Because this is an option, the above two restrictions are not enforced by
- // the protocol compiler.
- optional bool message_set_wire_format = 1 [default = false];
-
- // Disables the generation of the standard "descriptor()" accessor, which can
- // conflict with a field of the same name. This is meant to make migration
- // from proto1 easier; new code should avoid fields named "descriptor".
- optional bool no_standard_descriptor_accessor = 2 [default = false];
-
- // Is this message deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for the message, or it will be completely ignored; in the very least,
- // this is a formalization for deprecating messages.
- optional bool deprecated = 3 [default = false];
-
- reserved 4, 5, 6;
-
- // Whether the message is an automatically generated map entry type for the
- // maps field.
- //
- // For maps fields:
- // map<KeyType, ValueType> map_field = 1;
- // The parsed descriptor looks like:
- // message MapFieldEntry {
- // option map_entry = true;
- // optional KeyType key = 1;
- // optional ValueType value = 2;
- // }
- // repeated MapFieldEntry map_field = 1;
- //
- // Implementations may choose not to generate the map_entry=true message, but
- // use a native map in the target language to hold the keys and values.
- // The reflection APIs in such implementations still need to work as
- // if the field is a repeated message field.
- //
- // NOTE: Do not set the option in .proto files. Always use the maps syntax
- // instead. The option should only be implicitly set by the proto compiler
- // parser.
- optional bool map_entry = 7;
-
- reserved 8; // javalite_serializable
- reserved 9; // javanano_as_lite
-
-
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-message FieldOptions {
- // The ctype option instructs the C++ code generator to use a different
- // representation of the field than it normally would. See the specific
- // options below. This option is not yet implemented in the open source
- // release -- sorry, we'll try to include it in a future version!
- optional CType ctype = 1 [default = STRING];
- enum CType {
- // Default mode.
- STRING = 0;
-
- CORD = 1;
-
- STRING_PIECE = 2;
- }
- // The packed option can be enabled for repeated primitive fields to enable
- // a more efficient representation on the wire. Rather than repeatedly
- // writing the tag and type for each element, the entire array is encoded as
- // a single length-delimited blob. In proto3, only explicit setting it to
- // false will avoid using packed encoding.
- optional bool packed = 2;
-
- // The jstype option determines the JavaScript type used for values of the
- // field. The option is permitted only for 64 bit integral and fixed types
- // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING
- // is represented as JavaScript string, which avoids loss of precision that
- // can happen when a large value is converted to a floating point JavaScript.
- // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
- // use the JavaScript "number" type. The behavior of the default option
- // JS_NORMAL is implementation dependent.
- //
- // This option is an enum to permit additional types to be added, e.g.
- // goog.math.Integer.
- optional JSType jstype = 6 [default = JS_NORMAL];
- enum JSType {
- // Use the default type.
- JS_NORMAL = 0;
-
- // Use JavaScript strings.
- JS_STRING = 1;
-
- // Use JavaScript numbers.
- JS_NUMBER = 2;
- }
-
- // Should this field be parsed lazily? Lazy applies only to message-type
- // fields. It means that when the outer message is initially parsed, the
- // inner message's contents will not be parsed but instead stored in encoded
- // form. The inner message will actually be parsed when it is first accessed.
- //
- // This is only a hint. Implementations are free to choose whether to use
- // eager or lazy parsing regardless of the value of this option. However,
- // setting this option true suggests that the protocol author believes that
- // using lazy parsing on this field is worth the additional bookkeeping
- // overhead typically needed to implement it.
- //
- // This option does not affect the public interface of any generated code;
- // all method signatures remain the same. Furthermore, thread-safety of the
- // interface is not affected by this option; const methods remain safe to
- // call from multiple threads concurrently, while non-const methods continue
- // to require exclusive access.
- //
- //
- // Note that implementations may choose not to check required fields within
- // a lazy sub-message. That is, calling IsInitialized() on the outer message
- // may return true even if the inner message has missing required fields.
- // This is necessary because otherwise the inner message would have to be
- // parsed in order to perform the check, defeating the purpose of lazy
- // parsing. An implementation which chooses not to check required fields
- // must be consistent about it. That is, for any particular sub-message, the
- // implementation must either *always* check its required fields, or *never*
- // check its required fields, regardless of whether or not the message has
- // been parsed.
- //
- // As of 2021, lazy does no correctness checks on the byte stream during
- // parsing. This may lead to crashes if and when an invalid byte stream is
- // finally parsed upon access.
- //
- // TODO(b/211906113): Enable validation on lazy fields.
- optional bool lazy = 5 [default = false];
-
- // unverified_lazy does no correctness checks on the byte stream. This should
- // only be used where lazy with verification is prohibitive for performance
- // reasons.
- optional bool unverified_lazy = 15 [default = false];
-
- // Is this field deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for accessors, or it will be completely ignored; in the very least, this
- // is a formalization for deprecating fields.
- optional bool deprecated = 3 [default = false];
-
- // For Google-internal migration only. Do not use.
- optional bool weak = 10 [default = false];
-
-
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-
- reserved 4; // removed jtype
-}
-
-message OneofOptions {
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-message EnumOptions {
-
- // Set this option to true to allow mapping different tag names to the same
- // value.
- optional bool allow_alias = 2;
-
- // Is this enum deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for the enum, or it will be completely ignored; in the very least, this
- // is a formalization for deprecating enums.
- optional bool deprecated = 3 [default = false];
-
- reserved 5; // javanano_as_lite
-
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-message EnumValueOptions {
- // Is this enum value deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for the enum value, or it will be completely ignored; in the very least,
- // this is a formalization for deprecating enum values.
- optional bool deprecated = 1 [default = false];
-
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-message ServiceOptions {
-
- // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
- // framework. We apologize for hoarding these numbers to ourselves, but
- // we were already using them long before we decided to release Protocol
- // Buffers.
-
- // Is this service deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for the service, or it will be completely ignored; in the very least,
- // this is a formalization for deprecating services.
- optional bool deprecated = 33 [default = false];
-
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-message MethodOptions {
-
- // Note: Field numbers 1 through 32 are reserved for Google's internal RPC
- // framework. We apologize for hoarding these numbers to ourselves, but
- // we were already using them long before we decided to release Protocol
- // Buffers.
-
- // Is this method deprecated?
- // Depending on the target platform, this can emit Deprecated annotations
- // for the method, or it will be completely ignored; in the very least,
- // this is a formalization for deprecating methods.
- optional bool deprecated = 33 [default = false];
-
- // Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
- // or neither? HTTP based RPC implementation may choose GET verb for safe
- // methods, and PUT verb for idempotent methods instead of the default POST.
- enum IdempotencyLevel {
- IDEMPOTENCY_UNKNOWN = 0;
- NO_SIDE_EFFECTS = 1; // implies idempotent
- IDEMPOTENT = 2; // idempotent, but may have side effects
- }
- optional IdempotencyLevel idempotency_level = 34
- [default = IDEMPOTENCY_UNKNOWN];
-
- // The parser stores options it doesn't recognize here. See above.
- repeated UninterpretedOption uninterpreted_option = 999;
-
- // Clients can define custom options in extensions of this message. See above.
- extensions 1000 to max;
-}
-
-
-// A message representing a option the parser does not recognize. This only
-// appears in options protos created by the compiler::Parser class.
-// DescriptorPool resolves these when building Descriptor objects. Therefore,
-// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-// in them.
-message UninterpretedOption {
- // The name of the uninterpreted option. Each string represents a segment in
- // a dot-separated name. is_extension is true iff a segment represents an
- // extension (denoted with parentheses in options specs in .proto files).
- // E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents
- // "foo.(bar.baz).moo".
- message NamePart {
- required string name_part = 1;
- required bool is_extension = 2;
- }
- repeated NamePart name = 2;
-
- // The value of the uninterpreted option, in whatever type the tokenizer
- // identified it as during parsing. Exactly one of these should be set.
- optional string identifier_value = 3;
- optional uint64 positive_int_value = 4;
- optional int64 negative_int_value = 5;
- optional double double_value = 6;
- optional bytes string_value = 7;
- optional string aggregate_value = 8;
-}
-
-// ===================================================================
-// Optional source code info
-
-// Encapsulates information about the original source file from which a
-// FileDescriptorProto was generated.
-message SourceCodeInfo {
- // A Location identifies a piece of source code in a .proto file which
- // corresponds to a particular definition. This information is intended
- // to be useful to IDEs, code indexers, documentation generators, and similar
- // tools.
- //
- // For example, say we have a file like:
- // message Foo {
- // optional string foo = 1;
- // }
- // Let's look at just the field definition:
- // optional string foo = 1;
- // ^ ^^ ^^ ^ ^^^
- // a bc de f ghi
- // We have the following locations:
- // span path represents
- // [a,i) [ 4, 0, 2, 0 ] The whole field definition.
- // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
- // [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
- // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
- // [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
- //
- // Notes:
- // - A location may refer to a repeated field itself (i.e. not to any
- // particular index within it). This is used whenever a set of elements are
- // logically enclosed in a single code segment. For example, an entire
- // extend block (possibly containing multiple extension definitions) will
- // have an outer location whose path refers to the "extensions" repeated
- // field without an index.
- // - Multiple locations may have the same path. This happens when a single
- // logical declaration is spread out across multiple places. The most
- // obvious example is the "extend" block again -- there may be multiple
- // extend blocks in the same scope, each of which will have the same path.
- // - A location's span is not always a subset of its parent's span. For
- // example, the "extendee" of an extension declaration appears at the
- // beginning of the "extend" block and is shared by all extensions within
- // the block.
- // - Just because a location's span is a subset of some other location's span
- // does not mean that it is a descendant. For example, a "group" defines
- // both a type and a field in a single declaration. Thus, the locations
- // corresponding to the type and field and their components will overlap.
- // - Code which tries to interpret locations should probably be designed to
- // ignore those that it doesn't understand, as more types of locations could
- // be recorded in the future.
- repeated Location location = 1;
- message Location {
- // Identifies which part of the FileDescriptorProto was defined at this
- // location.
- //
- // Each element is a field number or an index. They form a path from
- // the root FileDescriptorProto to the place where the definition occurs.
- // For example, this path:
- // [ 4, 3, 2, 7, 1 ]
- // refers to:
- // file.message_type(3) // 4, 3
- // .field(7) // 2, 7
- // .name() // 1
- // This is because FileDescriptorProto.message_type has field number 4:
- // repeated DescriptorProto message_type = 4;
- // and DescriptorProto.field has field number 2:
- // repeated FieldDescriptorProto field = 2;
- // and FieldDescriptorProto.name has field number 1:
- // optional string name = 1;
- //
- // Thus, the above path gives the location of a field name. If we removed
- // the last element:
- // [ 4, 3, 2, 7 ]
- // this path refers to the whole field declaration (from the beginning
- // of the label to the terminating semicolon).
- repeated int32 path = 1 [packed = true];
-
- // Always has exactly three or four elements: start line, start column,
- // end line (optional, otherwise assumed same as start line), end column.
- // These are packed into a single field for efficiency. Note that line
- // and column numbers are zero-based -- typically you will want to add
- // 1 to each before displaying to a user.
- repeated int32 span = 2 [packed = true];
-
- // If this SourceCodeInfo represents a complete declaration, these are any
- // comments appearing before and after the declaration which appear to be
- // attached to the declaration.
- //
- // A series of line comments appearing on consecutive lines, with no other
- // tokens appearing on those lines, will be treated as a single comment.
- //
- // leading_detached_comments will keep paragraphs of comments that appear
- // before (but not connected to) the current element. Each paragraph,
- // separated by empty lines, will be one comment element in the repeated
- // field.
- //
- // Only the comment content is provided; comment markers (e.g. //) are
- // stripped out. For block comments, leading whitespace and an asterisk
- // will be stripped from the beginning of each line other than the first.
- // Newlines are included in the output.
- //
- // Examples:
- //
- // optional int32 foo = 1; // Comment attached to foo.
- // // Comment attached to bar.
- // optional int32 bar = 2;
- //
- // optional string baz = 3;
- // // Comment attached to baz.
- // // Another line attached to baz.
- //
- // // Comment attached to moo.
- // //
- // // Another line attached to moo.
- // optional double moo = 4;
- //
- // // Detached comment for corge. This is not leading or trailing comments
- // // to moo or corge because there are blank lines separating it from
- // // both.
- //
- // // Detached comment for corge paragraph 2.
- //
- // optional string corge = 5;
- // /* Block comment attached
- // * to corge. Leading asterisks
- // * will be removed. */
- // /* Block comment attached to
- // * grault. */
- // optional int32 grault = 6;
- //
- // // ignored detached comments.
- optional string leading_comments = 3;
- optional string trailing_comments = 4;
- repeated string leading_detached_comments = 6;
- }
-}
-
-// Describes the relationship between generated code and its original source
-// file. A GeneratedCodeInfo message is associated with only one generated
-// source file, but may contain references to different source .proto files.
-message GeneratedCodeInfo {
- // An Annotation connects some span of text in generated code to an element
- // of its generating .proto file.
- repeated Annotation annotation = 1;
- message Annotation {
- // Identifies the element in the original source .proto file. This field
- // is formatted the same as SourceCodeInfo.Location.path.
- repeated int32 path = 1 [packed = true];
-
- // Identifies the filesystem path to the original source .proto.
- optional string source_file = 2;
-
- // Identifies the starting offset in bytes in the generated code
- // that relates to the identified object.
- optional int32 begin = 3;
-
- // Identifies the ending offset in bytes in the generated code that
- // relates to the identified offset. The end offset should be one past
- // the last relevant byte (so the length of the text = end - begin).
- optional int32 end = 4;
- }
-}
diff --git a/core/repository/build.gradle.kts b/core/repository/build.gradle.kts
index 2fb94257db..d8d247ef84 100644
--- a/core/repository/build.gradle.kts
+++ b/core/repository/build.gradle.kts
@@ -26,7 +26,7 @@ kotlin {
sourceSets {
commonMain.dependencies {
api(projects.core.model)
- api(projects.core.proto)
+ api(libs.meshtastic.protobufs)
implementation(projects.core.common)
implementation(projects.core.database)
diff --git a/core/service/build.gradle.kts b/core/service/build.gradle.kts
index 3e522c9df3..23eb07ccc5 100644
--- a/core/service/build.gradle.kts
+++ b/core/service/build.gradle.kts
@@ -35,7 +35,7 @@ kotlin {
implementation(projects.core.network)
implementation(projects.core.ble)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.takserver)
implementation(libs.jetbrains.lifecycle.runtime)
diff --git a/core/takserver/build.gradle.kts b/core/takserver/build.gradle.kts
index d680b19c59..f89a0b542b 100644
--- a/core/takserver/build.gradle.kts
+++ b/core/takserver/build.gradle.kts
@@ -32,13 +32,15 @@ kotlin {
implementation(projects.core.common)
implementation(projects.core.di)
implementation(projects.core.model)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
- // TAKPacket-SDK is api()-exported by :core:proto (see
- // https://github.com/meshtastic/TAKPacket-SDK/issues/6).
- // Provides org.meshtastic.proto.TAKPacketV2 and friends, plus
- // the SDK's own org.meshtastic.tak.* parser/builder/compressor.
- // zstd-jni and xpp3 are excluded at the dep site in :core:proto
+ // org.meshtastic.proto.TAKPacketV2 and friends come from the
+ // protobufs SDK (api()-exported by :core:model for every target).
+ // The TAKPacket-SDK conversion pipeline (org.meshtastic.tak.*) is
+ // JVM-only since 0.5.2 and is api()-exported by :core:model's
+ // jvmAndroidMain — common code reaches it through the
+ // TakSdkCompressor/TakV2Compressor/CotSanitizer expect/actual seams.
+ // zstd-jni and xpp3 are excluded at the dep site in :core:model
// and re-added per-target below.
implementation(libs.okio)
diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt
new file mode 100644
index 0000000000..f71deb7b1b
--- /dev/null
+++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2026 Meshtastic LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package org.meshtastic.core.takserver
+
+/**
+ * Expect/actual wrapper for the TAKPacket-SDK's [org.meshtastic.tak.CotMeshSanitizer].
+ *
+ * The SDK publishes only JVM artifacts since 0.5.2, so common code cannot reference it directly. On JVM/Android the
+ * actual delegates to the SDK so the golden-tested sanitize rules live in ONE place shared by every consumer and can't
+ * drift between sides. On iOS the actual is a passthrough stub until the Swift SDK is wired up via interop.
+ */
+internal expect object CotSanitizer {
+
+ /**
+ * Normalize CoT XML for the TAK TCP stream — drop the `<?xml ...?>` prologue and collapse inter-tag whitespace so
+ * ATAK's streaming parser sees bare `<event>...</event>` on a single line.
+ */
+ fun normalizeCotXml(xml: String): String
+
+ /** Strip non-essential CoT detail before mesh compression to save wire bytes. */
+ fun stripNonEssentialForMesh(xml: String): String
+}
diff --git a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt
index d9c5aeeb12..031e06194d 100644
--- a/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt
+++ b/core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKMeshIntegration.kt
@@ -39,7 +39,6 @@ import org.meshtastic.proto.MeshPacket
import org.meshtastic.proto.PortNum
import org.meshtastic.proto.TAKPacket
import org.meshtastic.proto.Team
-import org.meshtastic.tak.CotMeshSanitizer
import kotlin.concurrent.Volatile
import kotlin.concurrent.atomics.AtomicBoolean
import kotlin.concurrent.atomics.ExperimentalAtomicApi
@@ -339,7 +338,7 @@ class TAKMeshIntegration(
// Normalize for the TAK TCP stream — drop the <?xml ...?> prologue
// and collapse inter-tag whitespace so ATAK's streaming parser sees
// bare <event>...</event> on a single line. Centralized in the SDK.
- val xml = CotMeshSanitizer.normalizeCotXml(rawXml)
+ val xml = CotSanitizer.normalizeCotXml(rawXml)
// Drop exact duplicates the mesh delivered more than once (multi-path relay or
// retransmit) so ATAK doesn't surface doubled chat / TAK-Talk messages. Genuine
// updates (new PLI position, moved marker, …) differ in content and pass through.
@@ -490,12 +489,12 @@ class TAKMeshIntegration(
}
/**
- * Strip non-essential CoT detail before mesh compression to save wire bytes. Delegates to the SDK's
- * [CotMeshSanitizer] so the strip rules live in ONE golden-tested place shared by every consumer (Android,
- * Apple, …) and can't drift between sides. Drift here once silently stripped TAK-Talk `<voice>` / `<marti>` and
- * broke the feature end-to-end — guarded by the strip-preservation test in TAKMeshIntegrationTest and by
- * CotMeshSanitizerTest in the SDK.
+ * Strip non-essential CoT detail before mesh compression to save wire bytes. Delegates (via the [CotSanitizer]
+ * expect/actual seam) to the SDK's CotMeshSanitizer so the strip rules live in ONE golden-tested place shared
+ * by every consumer (Android, Apple, …) and can't drift between sides. Drift here once silently stripped
+ * TAK-Talk `<voice>` / `<marti>` and broke the feature end-to-end — guarded by the strip-preservation test in
+ * TAKMeshIntegrationTest and by CotMeshSanitizerTest in the SDK.
*/
- fun stripNonEssentialElements(xml: String): String = CotMeshSanitizer.stripNonEssentialForMesh(xml)
+ fun stripNonEssentialElements(xml: String): String = CotSanitizer.stripNonEssentialForMesh(xml)
}
}
diff --git a/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt
new file mode 100644
index 0000000000..15b3f89baa
--- /dev/null
+++ b/core/takserver/src/iosMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2026 Meshtastic LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package org.meshtastic.core.takserver
+
+/**
+ * iOS stub for CotSanitizer.
+ *
+ * Passthrough — the JVM-only TAKPacket-SDK is unavailable here, and stale/whitespace normalization is tolerated by the
+ * iOS receive path (uncompressed TAK_TRACKER mode).
+ *
+ * TODO: Replace with Swift SDK integration via interop so the sanitize rules can't drift from the golden-tested SDK.
+ */
+internal actual object CotSanitizer {
+
+ actual fun normalizeCotXml(xml: String): String = xml
+
+ actual fun stripNonEssentialForMesh(xml: String): String = xml
+}
diff --git a/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt
new file mode 100644
index 0000000000..30dd09286a
--- /dev/null
+++ b/core/takserver/src/jvmAndroidMain/kotlin/org/meshtastic/core/takserver/CotSanitizer.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2026 Meshtastic LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package org.meshtastic.core.takserver
+
+import org.meshtastic.tak.CotMeshSanitizer
+
+internal actual object CotSanitizer {
+
+ actual fun normalizeCotXml(xml: String): String = CotMeshSanitizer.normalizeCotXml(xml)
+
+ actual fun stripNonEssentialForMesh(xml: String): String = CotMeshSanitizer.stripNonEssentialForMesh(xml)
+}
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
index e89e50468f..c6e248638c 100644
--- a/core/ui/build.gradle.kts
+++ b/core/ui/build.gradle.kts
@@ -37,7 +37,7 @@ kotlin {
implementation(projects.core.model)
implementation(projects.core.navigation)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.repository)
implementation(projects.core.resources)
implementation(projects.core.service)
diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts
index d684fafaef..9c13749464 100644
--- a/desktopApp/build.gradle.kts
+++ b/desktopApp/build.gradle.kts
@@ -259,7 +259,7 @@ dependencies {
implementation(projects.core.resources)
implementation(projects.core.service)
implementation(projects.core.ui)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.ble)
// Feature modules (JVM variants for real composable wiring)
diff --git a/feature/connections/build.gradle.kts b/feature/connections/build.gradle.kts
index b792e98822..b1c2c0d5df 100644
--- a/feature/connections/build.gradle.kts
+++ b/feature/connections/build.gradle.kts
@@ -31,7 +31,7 @@ kotlin {
implementation(projects.core.model)
implementation(projects.core.navigation)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.resources)
implementation(projects.core.service)
implementation(projects.core.ui)
diff --git a/feature/firmware/build.gradle.kts b/feature/firmware/build.gradle.kts
index b719f5a1be..345fb4f4db 100644
--- a/feature/firmware/build.gradle.kts
+++ b/feature/firmware/build.gradle.kts
@@ -35,7 +35,7 @@ kotlin {
implementation(projects.core.navigation)
implementation(projects.core.network)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.service)
implementation(projects.core.resources)
implementation(projects.core.ui)
diff --git a/feature/map/build.gradle.kts b/feature/map/build.gradle.kts
index 5d294aad01..63ce33a721 100644
--- a/feature/map/build.gradle.kts
+++ b/feature/map/build.gradle.kts
@@ -31,7 +31,7 @@ kotlin {
implementation(projects.core.model)
implementation(projects.core.navigation)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.service)
implementation(projects.core.resources)
implementation(projects.core.ui)
diff --git a/feature/messaging/build.gradle.kts b/feature/messaging/build.gradle.kts
index aeef8ca141..7b6b3b3939 100644
--- a/feature/messaging/build.gradle.kts
+++ b/feature/messaging/build.gradle.kts
@@ -27,7 +27,7 @@ kotlin {
implementation(projects.core.model)
implementation(projects.core.navigation)
implementation(projects.core.prefs)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.resources)
implementation(projects.core.service)
implementation(projects.core.ui)
diff --git a/feature/node/build.gradle.kts b/feature/node/build.gradle.kts
index 28210bf185..4e0a843541 100644
--- a/feature/node/build.gradle.kts
+++ b/feature/node/build.gradle.kts
@@ -33,7 +33,7 @@ kotlin {
implementation(projects.core.domain)
implementation(projects.core.model)
implementation(projects.core.navigation)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.repository)
implementation(projects.core.resources)
implementation(projects.core.service)
diff --git a/feature/settings/build.gradle.kts b/feature/settings/build.gradle.kts
index 83175f1441..2a24cc537b 100644
--- a/feature/settings/build.gradle.kts
+++ b/feature/settings/build.gradle.kts
@@ -32,7 +32,7 @@ kotlin {
implementation(projects.core.model)
implementation(projects.core.navigation)
implementation(projects.core.network)
- implementation(projects.core.proto)
+ implementation(libs.meshtastic.protobufs)
implementation(projects.core.repository)
implementation(projects.core.service)
implementation(projects.core.resources)
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index f24d7f6023..78453f512e 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -82,13 +82,13 @@ okio = "3.17.0"
uri-kmp = "0.0.21"
osmdroid-android = "6.1.20"
spotless = "8.6.0"
-wire = "6.4.0"
vico = "3.2.2"
kable = "0.43.0"
mqttastic = "0.3.6"
jmdns = "3.6.3"
qrcode-kotlin = "4.5.0"
-takpacket-sdk = "0.5.1"
+takpacket-sdk = "0.5.3"
+meshtastic-protobufs = "2.7.25"
# Gradle Plugins
develocity = "4.4.2"
@@ -179,7 +179,6 @@ maps-compose-widgets = { module = "com.google.maps.android:maps-compose-widgets"
mlkit-barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "mlkit-barcode-scanning" }
mlkit-translate = { module = "com.google.mlkit:translate", version.ref = "mlkit-translate" }
play-services-maps = { module = "com.google.android.gms:play-services-maps", version = "20.0.0" }
-wire-runtime = { module = "com.squareup.wire:wire-runtime", version.ref = "wire" }
zxing-core = { module = "com.google.zxing:core", version = "3.5.4" }
qrcode-kotlin = { module = "io.github.g0dkar:qrcode-kotlin", version.ref = "qrcode-kotlin" }
@@ -286,6 +285,9 @@ jna = { module = "net.java.dev.jna:jna", version = "5.19.0" }
takpacket-sdk-kmp = { module = "org.meshtastic:takpacket-sdk", version.ref = "takpacket-sdk" }
takpacket-sdk-jvm = { module = "org.meshtastic:takpacket-sdk-jvm", version.ref = "takpacket-sdk" }
+# Meshtastic Protobufs SDK (Wire-generated KMP models from meshtastic/protobufs)
+meshtastic-protobufs = { module = "org.meshtastic:protobufs", version.ref = "meshtastic-protobufs" }
+
[plugins]
# Android
@@ -318,7 +320,6 @@ aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "abo
datadog = { id = "com.datadoghq.dd-sdk-android-gradle-plugin", version.ref = "datadog-gradle" }
detekt = { id = "dev.detekt", version.ref = "detekt" }
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
-wire = { id = "com.squareup.wire", version.ref = "wire" }
room = { id = "androidx.room3", version.ref = "room" }
spotless = { id = "com.diffplug.spotless", version.ref = "spotless" }
test-retry = { id = "org.gradle.test-retry", version.ref = "testRetry" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 1f6629f922..b9c476c96e 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -111,7 +111,6 @@ include(
":core:network",
":core:nfc",
":core:prefs",
- ":core:proto",
":core:repository",
":core:service",
":core:resources",
Served by rngit 1.4.2 - Generated in 0.45s